Problem Link
https://leetcode.com/problems/product-of-array-except-self/
How to solve
Suppose we have a number i
. Notice that the product of all numbers except i
is equal to the product of all numbers to the left of i
multiplied by the product of all numbers to the right of i
. For example, let the array nums = [1,2,3,4]. For every number i
, calculate the product of all numbers to the left of i
. We have the array:
L = [1, 1, 2, 6]
To calculate the product of all numbers to the right of i
, we don't need to create another array. Instead, we keep a variable R
that represents the running-product of all elements to the right of i
. Iterating through the array backwards, for every index j
, we multiply L[j]
by R
to get the product of all numbers except nums[j]
. We update our running-product R
by mulitiplying it by nums[j]
.
Complexity Analysis
Time: O(N)
We iterate through the nums array twice, which is O(2n) = O(n)
. First, to create an array L
which holds the products of all elements to the left of index i
. Second, we iterate through L
backwards, updating each index to hold the product of all numbers except nums[i] for all i
.
Space: O(1)
Although we create an array of size N
to store the products for each number in nums, the problem states that the output array does not count toward our space complexity.
Solutions
Python
def productExceptSelf(self, nums: List[int]) -> List[int]: L = [1 for _ in range(len(nums))] for i in range(1, len(nums)): L[i] = nums[i - 1] * L[i - 1] ans = L R = 1 for j in range(len(nums) - 1, -1, -1): ans[j] *= R R *= nums[j] return ans
Go
Using C-style for-loop
func productExceptSelf(nums []int) []int { L := make([]int, len(nums)) L[0] = 1 for j := 1; j < len(nums); j++ { L[j] = nums[j - 1] * L[j - 1] } ans := L R := 1 for k := len(nums) - 1; k > -1; k-- { ans[k] *= R R *= nums[k] } return ans }
Using range loop
func productExceptSelf(nums []int) []int { L := make([]int, len(nums)) L[0] = 1 for j, num := range nums[0 : len(nums) - 1] { L[j + 1] = num * L[j] } ans := L R := 1 for i, _ := range nums { ans[len(nums) - 1 - i] *= R R *= nums[len(nums) - 1 - i] } return ans }
Rust
pub fn product_except_self(nums: Vec<i32>) -> Vec<i32> { let mut L = vec![1; nums.len()]; for i in 1..nums.len() { L[i] = nums[i - 1] * L[i - 1]; } let mut ans = L; let mut R = 1; for j in (0..nums.len()).rev() { ans[j] *= R; R *= nums[j]; } ans }